package com.cskaoyan.javase.oop2._1extends._10final._2method;

/**
 * final修饰方法表示最后的方法，最终的方法，
 *      表示该方法无法被重写 （但是仍然可以被继承）。
 *
 * 语法(以成员方法为例)：
 * [访问权限修饰符] final 返回值类型 方法名(形参列表){
 *  //方法体
 * }
 *
 * 说明：
 * final修饰成员方法，表示该方法无法被重写，但是仍然是可以继承的。
 *
 * 什么样的成员方法应该设置为final呢？
 * 方法的设计已经比较完善，不需要子类进行修改了，子类只需要乖乖继承，
 * 使用父类的实现即可。
 *
 * 比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 * 即便是父类的方法不是很完善，但只要是希望子类不要改写方法都可以这么做。
 * （要么你就用，不爽你就自己实现一个）
 *
 * 日常开发，程序员还是比较少见有需要把方法设置成final修饰的。同样比较多见于JDK源码中，比较常见的有：像Object类中的getClass()方法还有其中和线程相关的方法。
 *
 * 注意：
 * 并不是随便拿一个方法都能用final修饰的，开发中比较常见的final方法也是源码中的
 * 最典型的就是Object类当中的getClass()方法
 *
 * 一些特殊的方法和final关键字组合的作用:
 * private方法，本来就无法重写，不需要多此一举。（可以修饰，但是会报警告）
 * static方法，本来就无法重写，不需要多此一举。（可以修饰，但是会报警告）
 * 构造方法,本来就无法重写,也不能用final修饰 会编译报错
 *
 * @since 10:59
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        s.test();
    }
}
class Person{
    // 'private' method declared 'final'
    private final int test(){
        return 1;
    }

    // 'static' method declared 'final'
    public final static void testStatic(){

    }

    // public final Person() {
    // }

    public final void eat(){
        System.out.println("正常吃饭!");
    }
}
class LaoBa extends Person{
    // test
    /*@Override
    public void eat() {
        System.out.println("我专门吃不正常的!");
    }*/
}
class Father {
    public final void test() {
        System.out.println("father");
    }
}

class Son extends Father {
    // @Override
    // 'test()' cannot override 'test()' in 'com.cskaoyan.javase.oop2._1extends._10final._2method.Father'; overridden method is final
    /*public void test() {
        System.out.println("son");
    }*/
}